/**
 * 函数防抖动封装。
 * 用于限制函数调用的频率，当函数调用过于频繁时，可以使用防抖动技术来降低调用频率。
 *
 * @param func 要执行的函数
 * @param wait 等待时间，单位为毫秒
 * @param immediate 是否立即执行，默认为false。如果设置为true，则在第一次调用时立即执行，而不是等待等待时间后执行。
 * @returns 返回一个新函数，该函数具有防抖动功能。
 */
export function debounce(func: Function, wait: number, immediate: boolean = false) {
    // 用于存储定时器的变量
    let timeout: NodeJS.Timeout | null

    // 返回一个封装的函数，该函数具有防抖动功能
    return function(this: any) {
        // 保存当前上下文和参数
        const context = this, args: IArguments = arguments
        // 定义延时执行的函数
        const later = function() {
            // 清除定时器，以允许下一次调用
            timeout = null
            // 如果不是立即执行模式，则调用原始函数
            if (!immediate) {
                func.apply(context, args)
            }
        }

        // 判断是否应该立即执行
        const callNow = immediate && !timeout
        // 清除任何现有的定时器，以避免干扰
        // if (timeout){
        //     clearTimeout(timeout)
        // }
        clearTimeout(timeout!) //参数后面的!是类型断言，告诉编译器，timeout的值一定不为null
        // 设置新的定时器
        timeout = setTimeout(later, wait)
        // 如果应该立即执行，则调用原始函数
        if (callNow) {
            func.apply(context, args)
        }
    }
}

